/**
 * 链队列
1. 基于链队列实现 "打印任务模拟"：
每个任务含 ID 和打印页数，每页打印耗时 1 秒，统计每个任务的等待时间和完成时间。
测试用例：3 个任务（ID1:2 页，ID2:3 页，ID3:1
本套试题由曹婷老师根据元宇宙平台非凡就业班课程内容整理
页），输出各任务的等待时间（0,2,5）和完成时间（2,5,6）。
 */
#include <stdio.h>
#include <stdlib.h>

//一个任务是id和页数组成 得把id和页数描述成任务节点
//队列里面放任务，那么一个任务就要做成一个节点结构体
// 链队列结构体

//// 打印任务结构体
typedef struct Task{
    int id; //任务含 ID 
    int pages;//打印页数
}Task;

// 链队列节点结构体
typedef struct Node{
    struct Task task;
    struct Node *next;
}Node;

// 链队列结构体
typedef struct{
    Node *front;
    Node* rear;
}LinkQueue;

// 初始化队列 带哨兵
void initQueue(LinkQueue* q){
    q->front =q->rear = (Node*)malloc(sizeof(Node));
    q->front->next = NULL;//表示队列为空。

    
}

// 判断队列是否为空
int isEmpty(LinkQueue* q){
    return q->front==q->rear;
}
// 入队操作
void enqueue(LinkQueue* q,Task task){
    //有哨兵就不需要判断 无论队列是否为空，都只需操作rear->next；
    Node* newNode =(Node*)malloc(sizeof(Node));
    if(newNode==NULL)
    {
        return;
    }
    newNode->task = task;
    newNode->next = NULL;
    q->rear->next = newNode;
    q->rear = newNode;
}

// 出队操作
Task dequeue(LinkQueue* q){
    Node* cur =q->front->next;//有哨兵 别写错
    Task curtask = cur->task;
    q->front = cur->next;
    // 如果队尾指针指向出队节点，更新队尾指针
    if(q->front==NULL)
    {
        q->rear =q->front;
    }
    free(cur);
    return curtask;
}

// 模拟打印任务
/**
 * 每个任务含 ID 和打印页数，每页打印耗时 1 秒，统计每个任务的等待时间和完成时间。
 * 3 个任务（ID1:2 页，ID2:3 页，ID3:1
本套试题由曹婷老师根据元宇宙平台非凡就业班课程内容整理
页），输出各任务的等待时间（0,2,5）和完成时间（2,5,6）。
 */
void simulatePrinting(LinkQueue* q){
    Node* temp = q->front->next;
    Node* temp2 =temp;
    int count=0; 
    int count2=0;
    printf("等待时间(");



    while(temp!=NULL)
    {
        if(temp->next!=NULL)
        {
            printf("%d,",count);
        }else{
            printf("%d)",count);
        }
        count = count + temp->task.pages;
        temp = temp->next;
    }
    printf("\n");
    printf("完成时间(");
    while(temp2!=NULL)
    {
        count2 = count2 + temp2->task.pages;
        if(temp2->next!=NULL)
        {
            printf("%d,",count2);
        }else{
            printf("%d)",count2);
        }
        temp2 = temp2->next;
    }



    printf("\n");


}

int main(){
    LinkQueue q ;
    initQueue(&q);
    Task task1 ={1,2};
    Task task2 ={2,3};
    Task task3 ={3,1};
    enqueue(&q,task1);
    enqueue(&q,task2);
    enqueue(&q,task3);
    simulatePrinting(&q);
}